Questions 7, 8, 9, 10. Transportation behavior.

## Create survey object.
options(digits = 4)
options(survey.lonely.psu = "adjust")

des <- svydesign(ids = ~1, weights = ~weight, data = df[is.na(df$weight)==F, ])

Q7. What types of public transportation do you regularly use?

# subset question data, rename columns, gather into single column
q7_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
         Q7_1:Q7_7, Q7_otherText, weight) %>%
  rename(Bus = Q7_1, Carpool = Q7_2, Subway = Q7_3, Train = Q7_4,
         Taxi = Q7_5, Airplane = Q7_6, Other = Q7_7) %>%
  gather(Q7_q, Q7_r, Bus:Other, na.rm = T) %>%
  mutate(Q7_q = as.factor(Q7_q))

# select only Yes responses
q7_df <- q7_df[(q7_df$Q7_r)=='Yes', ]
str(q7_df)
'data.frame':   324 obs. of  22 variables:
 $ CaseID      : int  2 5 15 18 23 44 53 69 72 75 ...
 $ PPGENDER    : Factor w/ 2 levels "Female","Male": 1 2 2 2 1 1 2 1 1 2 ...
 $ PPAGE       : int  18 56 50 33 65 70 55 22 25 55 ...
 $ ppagecat    : Factor w/ 7 levels "18-24","25-34",..: 1 5 4 2 6 6 5 1 2 5 ...
 $ PPETHM      : Factor w/ 5 levels "White, Non-Hispanic",..: 1 1 1 2 3 1 3 3 5 1 ...
 $ PPINCIMP    : Ord.factor w/ 19 levels "Less than $5,000"<..: 19 16 10 1 6 1 16 14 17 8 ...
 $ PPEDUC      : Factor w/ 14 levels "No formal education",..: 9 14 9 9 10 6 12 10 10 9 ...
 $ PPEDUCAT    : Factor w/ 4 levels "Less than high school",..: 2 4 2 2 3 1 4 3 3 2 ...
 $ work        : Factor w/ 2 levels "unemployed","employed": 1 2 2 1 1 1 2 2 1 1 ...
 $ PPWORK      : Factor w/ 7 levels "Not working - disabled",..: 4 6 6 1 5 1 7 6 4 5 ...
 $ marital     : Factor w/ 2 levels "single","partnered": 1 2 1 1 2 1 1 1 1 1 ...
 $ PPMARIT     : Factor w/ 6 levels "Never married",..: 1 3 1 1 3 6 5 1 1 5 ...
 $ PPMSACAT    : Factor w/ 2 levels "Metro","Non-Metro": 1 1 1 1 1 1 1 1 1 1 ...
 $ ppreg9      : Factor w/ 9 levels "East-North Central",..: 3 4 7 3 3 1 3 1 6 1 ...
 $ PPSTATEN    : Factor w/ 51 levels "AK","AL","AR",..: 32 4 46 39 35 16 32 15 5 23 ...
 $ PPHOUSE     : Factor w/ 5 levels "A building with 2 or more apartments",..: 4 4 1 1 1 4 1 4 4 1 ...
 $ PPRENT      : Factor w/ 3 levels "Occupied without payment of cash rent",..: 2 2 3 3 3 3 2 2 2 3 ...
 $ PPNET       : Factor w/ 2 levels "No","Yes": 2 2 2 1 1 2 1 2 2 1 ...
 $ Q7_otherText: Factor w/ 15 levels "bike,walk","car",..: NA NA NA NA NA NA NA NA NA NA ...
 $ weight      : num  1.314 0.646 0.799 1.642 1.223 ...
 $ Q7_q        : Factor w/ 7 levels "Airplane","Bus",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ Q7_r        : chr  "Yes" "Yes" "Yes" "Yes" ...
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des7 <- svydesign(ids = ~1, weights = ~weight, data = q7_df[is.na(q7_df$weight)==F, ])

Gender, age, ethnicity, income, education, work

# weighted data frame
q7 <- data.frame(svytable(~Q7_q + Q7_r + PPGENDER + ppagecat + PPETHM + PPINCIMP +
                            PPEDUC + PPEDUCAT + work + PPWORK, des7, round = T))
# plot templates
title <- ggtitle("What types of public transportation do you regularly use?")

## main plot
p <- ggplot(q7, aes(Q7_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Other' column
p2 <- ggplot(q7[!(q7$Q7_q)=='Other', ], aes(Q7_q, weight = Freq)) + ptext

# by gender
p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q7_q) + ggtitle("By gender")

# age boxplot
svyboxplot(PPAGE~Q7_q, des7, main = "Age boxplot per response")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q7_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q7_q)

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q7_q) + ggtitle("By ethnic group") +
  ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q7_q)

p + geom_bar() + aes(fill = Q7_q) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q7_q) + ggtitle("By income") + 
  ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q7_q)

# by education
p + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_wrap(~Q7_q) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q7_q)

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q7_q)

p + geom_bar() + aes(fill = Q7_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT)

# by work status
p + geom_bar() + aes(work, fill = work) + facet_wrap(~Q7_q) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q7_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# update weighted data frame
q7.2 <- data.frame(svytable(~Q7_q + Q7_r + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des7, round = T))

# restate plots
p3 <- ggplot(q7.2, aes(Q7_q, weight = Freq)) + ptext
p4 <- ggplot(q7.2[!(q7.2$Q7_q)=='Other', ], aes(Q7_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q7_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(marital, fill = Q7_q)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q7_q)

p3 + geom_bar() + aes(PPMARIT, fill = Q7_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(PPMSACAT, fill = PPMSACAT) + facet_wrap(~Q7_q) + ggtitle("By metro status")

p3 + geom_bar(position = "stack") + aes(fill = PPMSACAT)

p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT)

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q7_q) + ggtitle("US regions by response")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q7_q) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q7_q) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By house type")

p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p3 + geom_bar() + aes(PPHOUSE, fill = PPHOUSE) + facet_wrap(~Q7_q) + ptext2

# by housing status

# by internet availability
p3 + geom_bar(position = "fill") + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = 'fill') + aes(PPNET, fill = Q7_q) + ggtitle("Internet status")

Q8. For what types of activities do you regularly use public transportation?

# subset question data, rename columns, gather into single column
q8_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
         Q8_1:Q8_6, weight) %>%
  rename(Work = Q8_1, School = Q8_2, Shopping = Q8_3, Visiting_people = Q8_4,
         Recreation = Q8_5, Other = Q8_6) %>%
  gather(Q8_q, Q8_r, Work:Other, na.rm = T) %>%
  mutate(Q8_q = as.factor(Q8_q))

# select only Yes responses
q8_df <- q8_df[q8_df$Q8_r == 'Yes', ]
str(q8_df)
'data.frame':   383 obs. of  21 variables:
 $ CaseID  : int  5 15 32 53 69 149 157 162 168 191 ...
 $ PPGENDER: Factor w/ 2 levels "Female","Male": 2 2 2 2 1 1 2 1 2 2 ...
 $ PPAGE   : int  56 50 27 55 22 26 48 25 31 25 ...
 $ ppagecat: Factor w/ 7 levels "18-24","25-34",..: 5 4 2 5 1 2 4 2 2 2 ...
 $ PPETHM  : Factor w/ 5 levels "White, Non-Hispanic",..: 1 1 5 3 3 5 2 1 4 1 ...
 $ PPINCIMP: Ord.factor w/ 19 levels "Less than $5,000"<..: 16 10 11 16 14 8 7 17 14 8 ...
 $ PPEDUC  : Factor w/ 14 levels "No formal education",..: 14 9 13 12 10 12 12 13 14 9 ...
 $ PPEDUCAT: Factor w/ 4 levels "Less than high school",..: 4 2 4 4 3 4 4 4 4 2 ...
 $ work    : Factor w/ 2 levels "unemployed","employed": 2 2 2 2 2 2 2 2 2 2 ...
 $ PPWORK  : Factor w/ 7 levels "Not working - disabled",..: 6 6 6 7 6 6 6 6 6 6 ...
 $ marital : Factor w/ 2 levels "single","partnered": 2 1 2 1 1 1 1 2 1 1 ...
 $ PPMARIT : Factor w/ 6 levels "Never married",..: 3 1 2 5 1 1 1 2 1 1 ...
 $ PPMSACAT: Factor w/ 2 levels "Metro","Non-Metro": 1 1 1 1 1 1 1 1 1 1 ...
 $ ppreg9  : Factor w/ 9 levels "East-North Central",..: 4 7 3 3 1 1 3 3 6 6 ...
 $ PPSTATEN: Factor w/ 51 levels "AK","AL","AR",..: 4 46 39 32 15 23 35 35 5 48 ...
 $ PPHOUSE : Factor w/ 5 levels "A building with 2 or more apartments",..: 4 1 1 1 4 4 1 1 1 4 ...
 $ PPRENT  : Factor w/ 3 levels "Occupied without payment of cash rent",..: 2 3 3 2 2 1 3 3 3 3 ...
 $ PPNET   : Factor w/ 2 levels "No","Yes": 2 2 2 1 2 1 2 2 2 2 ...
 $ weight  : num  0.646 0.799 0.384 1.264 1.813 ...
 $ Q8_q    : Factor w/ 6 levels "Other","Recreation",..: 6 6 6 6 6 6 6 6 6 6 ...
 $ Q8_r    : chr  "Yes" "Yes" "Yes" "Yes" ...
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des8 <- svydesign(ids = ~1, weights = ~weight, data = q8_df[is.na(q8_df$weight)==F, ])

Gender, age, ethnicity, income, education

# weighted data frame
q8 <- data.frame(svytable(~Q8_q + Q8_r + PPGENDER + ppagecat + PPETHM + PPINCIMP + 
                            PPEDUC + PPEDUCAT + work + PPWORK, des8, round = T))
# plot templates
title <- ggtitle("For what types of activities do you regularly use public transportation?")

## main plot
p <- ggplot(q8, aes(Q8_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Other' column
p2 <- ggplot(q8[!(q8$Q8_q)=='Other', ], aes(Q8_q, weight = Freq)) + ptext

# by gender
p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q8_q) + ggtitle("By gender")

# age boxplot
svyboxplot(PPAGE~Q8_q, des8, main = "Age boxplot per response")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q8_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q8_q)

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q8_q) + ggtitle("By ethnic group") +
  ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q8_q)

p + geom_bar() + aes(fill = Q8_q) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q8_q) + ggtitle("By income") + 
  ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q8_q)

# by education
p + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_wrap(~Q8_q) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q8_q)

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q8_q)

p + geom_bar() + aes(fill = Q8_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT)

# by work status
p + geom_bar() + aes(work, fill = work) + facet_wrap(~Q8_q) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q8_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# weighted data frame
q8.2 <- data.frame(svytable(~Q8_q + Q8_r + work + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des8, round = T))
# restate plots
p3 <- ggplot(q8.2, aes(Q8_q, weight = Freq)) + ptext
p4 <- ggplot(q8.2[!(q8.2$Q8_q)=='Other', ], aes(Q8_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q8_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(marital, fill = Q8_q)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q8_q)

p3 + geom_bar() + aes(PPMARIT, fill = Q8_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(PPMSACAT, fill = PPMSACAT) + facet_wrap(~Q8_q) + ggtitle("By metro status")

p3 + geom_bar(position = "stack") + aes(fill = PPMSACAT)

p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT)

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q8_q) + ggtitle("US regions by response")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q8_q) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q8_q) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By house type")

p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p3 + geom_bar() + aes(PPHOUSE, fill = PPHOUSE) + facet_wrap(~Q8_q) + ptext2

# by housing status

# by internet availability
p3 + geom_bar(position = "fill") + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = 'fill') + aes(PPNET, fill = Q8_q) + ggtitle("Internet status")

Q9. Do other members of your household regularly use public transportation?

Ethnicity, income, metro status, region, state, house type, housing status

# weighted data frame
q9 <- data.frame(svytable(~Q9 + PPETHM + PPINCIMP + PPMSACAT + ppreg9 + 
                            PPSTATEN + PPHOUSE + PPRENT, des, round = T))
# plot templates
title <- ggtitle("Do other members of your household regularly use public transportation?")

## main plot
p <- ggplot(q9, aes(Q9, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Don_t know' column
p2 <- ggplot(q9[!(q9$Q9)=='Don_t know', ], aes(Q9, weight = Freq)) + ptext

# by ethnic group
p2 + geom_bar() + aes(fill = PPETHM) + ggtitle("By ethnic group") + ptext2

p2 + geom_bar(position = "fill") + aes(PPETHM, fill = Q9)

p2 + geom_bar() + aes(fill = Q9) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p2 + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p2 + geom_bar() + aes(fill = PPINCIMP) + ggtitle("By income") + ptext2

p2 + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q9)

# by metro status
p2 + geom_bar() + aes(fill = PPMSACAT) + ggtitle("By metro status")

p2 + geom_bar(position = "stack") + aes(PPMSACAT, fill = Q9)

# by region
p2 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p2 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q9) + ggtitle("US regions by response")

# by state
p2 + geom_bar() + aes(PPSTATEN, fill = Q9) + coord_flip() + ggtitle("By state")

p2 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q9) + coord_flip() + ggtitle("By state")

# by house type
p2 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By housing")

p2 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p2 + geom_bar() + aes(PPHOUSE, fill = Q9) + ptext2

# by housing status

Q10. What types of public transportation do other members of your household regularly use?

# subset question data, rename columns, gather into single column
q10_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
       Q10_1:Q10_8, weight) %>%
  rename(Bus = Q10_1, Carpool = Q10_2, Subway = Q10_3, Train = Q10_4,
         Taxi = Q10_5, Airplane = Q10_6, Don_t_know = Q10_7, Other = Q10_8) %>%
  gather(Q10_q, Q10_r, Bus:Other, na.rm = T) %>%
  mutate(Q10_q = as.factor(Q10_q))

# select only Yes responses
q10_df <- q10_df[q10_df$Q10_r == 'Yes', ]
str(q10_df)
'data.frame':   308 obs. of  21 variables:
 $ CaseID  : int  26 44 61 69 72 127 137 145 162 177 ...
 $ PPGENDER: Factor w/ 2 levels "Female","Male": 1 1 1 1 1 1 1 2 1 1 ...
 $ PPAGE   : int  37 70 45 22 25 75 59 21 25 31 ...
 $ ppagecat: Factor w/ 7 levels "18-24","25-34",..: 3 6 4 1 2 7 5 1 2 2 ...
 $ PPETHM  : Factor w/ 5 levels "White, Non-Hispanic",..: 1 1 1 3 5 2 2 1 1 1 ...
 $ PPINCIMP: Ord.factor w/ 19 levels "Less than $5,000"<..: 13 1 16 14 17 14 1 13 17 18 ...
 $ PPEDUC  : Factor w/ 14 levels "No formal education",..: 11 6 9 10 10 4 1 10 13 12 ...
 $ PPEDUCAT: Factor w/ 4 levels "Less than high school",..: 3 1 2 3 3 1 1 3 4 4 ...
 $ work    : Factor w/ 2 levels "unemployed","employed": 2 1 2 2 1 1 1 2 2 2 ...
 $ PPWORK  : Factor w/ 7 levels "Not working - disabled",..: 6 1 6 6 4 5 2 6 6 6 ...
 $ marital : Factor w/ 2 levels "single","partnered": 2 1 2 1 1 1 1 1 2 2 ...
 $ PPMARIT : Factor w/ 6 levels "Never married",..: 3 6 3 1 1 4 1 1 2 3 ...
 $ PPMSACAT: Factor w/ 2 levels "Metro","Non-Metro": 2 1 1 1 1 1 1 1 1 1 ...
 $ ppreg9  : Factor w/ 9 levels "East-North Central",..: 1 1 3 1 6 3 9 4 3 6 ...
 $ PPSTATEN: Factor w/ 51 levels "AK","AL","AR",..: 16 16 35 15 5 35 3 45 35 48 ...
 $ PPHOUSE : Factor w/ 5 levels "A building with 2 or more apartments",..: 4 4 4 4 4 1 4 4 1 4 ...
 $ PPRENT  : Factor w/ 3 levels "Occupied without payment of cash rent",..: 2 3 2 2 2 3 3 2 3 2 ...
 $ PPNET   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 1 2 2 2 ...
 $ weight  : num  0.935 0.957 0.845 1.813 0.446 ...
 $ Q10_q   : Factor w/ 8 levels "Airplane","Bus",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ Q10_r   : chr  "Yes" "Yes" "Yes" "Yes" ...
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des10 <- svydesign(ids = ~1, weights = ~weight, data = q10_df[is.na(q10_df$weight)==F, ])

Gender, age, ethnicity, income, education, work

# weighted data frame
q10 <- data.frame(svytable(~Q10_q + Q10_r + PPGENDER + ppagecat + PPETHM + PPINCIMP +
                            PPEDUC + PPEDUCAT + work + PPWORK, des10, round = T))
# plot templates
title <- ggtitle("What types of public transportation do other members of your household regularly use?")

## main plot
p <- ggplot(q10, aes(Q10_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Don_t know' column
p2 <- ggplot(q10[!(q10$Q10_q)=='Don_t_know', ], aes(Q10_q, weight = Freq)) + ptext

# by gender
p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q10_q) + ggtitle("By gender")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q10_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q10_q)

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q10_q) + ggtitle("By ethnic group") +
  ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q10_q)

p + geom_bar() + aes(fill = Q10_q) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q10_q) + ggtitle("By income") + 
  ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q10_q)

# by education
p + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_wrap(~Q10_q) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q10_q)

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q10_q)

p + geom_bar() + aes(fill = Q10_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT)

# by work status
p + geom_bar() + aes(work, fill = work) + facet_wrap(~Q10_q) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q10_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# update weighted data frame
q10.2 <- data.frame(svytable(~Q10_q + Q10_r + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des10, round = T))
# restate plots
p3 <- ggplot(q10.2, aes(Q10_q, weight = Freq)) + ptext
p4 <- ggplot(q10.2[!(q10.2$Q10_q)=='Don_t_know', ], aes(Q10_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q10_q) + ggtitle("By marital status")

p3 + geom_bar(position = 'fill') + aes(marital, fill = Q10_q)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q10_q)

p3 + geom_bar() + aes(PPMARIT, fill = Q10_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(PPMSACAT, fill = PPMSACAT) + facet_wrap(~Q10_q) + ggtitle("By metro status")

p3 + geom_bar(position = 'stack') + aes(fill = PPMSACAT)

p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT)

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q10_q) + ggtitle("US regions by response")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q10_q) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q10_q) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By housing")

p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p3 + geom_bar() + aes(PPHOUSE, fill = PPHOUSE) + facet_wrap(~Q10_q) + ptext2

# by housing status

# by internet availability
p3 + geom_bar(position = 'fill') + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = 'fill') + aes(PPNET, fill = Q10_q) + ggtitle("Internet status")

LS0tCnRpdGxlOiAiQmVoYXZpb3IgcGFydCAxOiBUcmFuc3BvcnRhdGlvbiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ193aWR0aDogNgogICAgdGhlbWU6IHBhcGVyCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKLS0tCgpRdWVzdGlvbnMgNywgOCwgOSwgMTAuClRyYW5zcG9ydGF0aW9uIGJlaGF2aW9yLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMjIFNldHVwLgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFQsIGNhY2hlID0gVCwgY2FjaGUuY29tbWVudHMgPSBGLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIHNpemUgPSAic21hbGwiKQpybShsaXN0ID0gbHMoYWxsLm5hbWVzID0gVCkpCmxpYnJhcnkocm1hcmtkb3duKTsgbGlicmFyeShrbml0cik7IGxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHRpZHlyKTsgbGlicmFyeShkcGx5cik7IGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoc3VydmV5KQpgYGAKCmBgYHtyIGxvYWQtZGF0YSwgaW5jbHVkZT1GfQojIyBMb2FkIGRhdGEuCmxvYWQoIn4vZ2l0L2ZsdS1zdXJ2ZXkvZGF0YS9jbGVhbmluZzIuUkRhdGEiKQpsb2FkKCJ+L2dpdC9mbHUtc3VydmV5L2RhdGEvcmVjb2RpbmcuUkRhdGEiKSAgIyBsb2FkIGRhdGFyCmRmIDwtIGRhdGFyICAjIHJlY29kZWQgdmFyaWFibGVzCmBgYAoKYGBge3IgZ3JvdXAtZGF0YSwgaW5jbHVkZT1GfQojIyBSZWdyb3VwIHZhcmlhYmxlcy4KIyBpbmNvbWUKaW5jb21lLm1hcCA8LSBjKHJlcCgidW5kZXIgJDEwayIsIDMpLCByZXAoIiQxMGsgdG8gJDI1ayIsIDQpLAogICAgICAgICAgICAgICAgcmVwKCIkMjVrIHRvICQ1MGsiLCA0KSwgcmVwKCIkNTBrIHRvICQ3NWsiLCAyKSwKICAgICAgICAgICAgICAgIHJlcCgiJDc1ayB0byAkMTAwayIsIDIpLCByZXAoIiQxMDBrIHRvICQxNTBrIiwgMiksCiAgICAgICAgICAgICAgICByZXAoIm92ZXIgJDE1MGsiLCAyKSkKZGYkaW5jb21lIDwtIGNvZGUoZGF0YXIkUFBJTkNJTVAsIGluY29tZS5tYXAsICJ1bmRlciAkMTBrIikKaW5jb21lLmxhYiA8LSBjKCJ1bmRlciAkMTBrIiwgIiQxMGsgdG8gJDI1ayIsICIkMjVrIHRvICQ1MGsiLAogICAgICAgICAgICAgICAgIiQ1MGsgdG8gJDc1ayIsICIkNzVrIHRvICQxMDBrIiwgIiQxMDBrIHRvICQxNTBrIiwKICAgICAgICAgICAgICAgICJvdmVyICQxNTBrIikKZGYkaW5jb21lIDwtIGZhY3RvcihkZiRpbmNvbWUsIGxldmVscyA9IGluY29tZS5sYWIpCgojIG1hcml0YWwgc3RhdXMKbWFyaXRhbC5tYXAgPC0gYygic2luZ2xlIiwgInBhcnRuZXJlZCIsICJwYXJ0bmVyZWQiLCAic2luZ2xlIiwgInNpbmdsZSIsICJzaW5nbGUiKQpkZiRtYXJpdGFsIDwtIGNvZGUoZGF0YWYkUFBNQVJJVCwgbWFyaXRhbC5tYXAsICJzaW5nbGUiKQoKIyB3b3JrIHN0YXR1cwp3b3JrLm1hcCA8LSBjKHJlcCgidW5lbXBsb3llZCIsIDUpLAogICAgICAgICAgICAgIHJlcCgiZW1wbG95ZWQiLCAyKSkKZGYkd29yayA8LSBjb2RlKGRhdGFmJFBQV09SSywgd29yay5tYXAsICJ1bmVtcGxveWVkIikKYGBgCgpgYGB7ciBkZXMtc3VydmV5fQojIyBDcmVhdGUgc3VydmV5IG9iamVjdC4Kb3B0aW9ucyhkaWdpdHMgPSA0KQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1ID0gImFkanVzdCIpCgpkZXMgPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IGRmW2lzLm5hKGRmJHdlaWdodCk9PUYsIF0pCmBgYAoKYGBge3IgcGxvdC10ZW1wLCBpbmNsdWRlPUZ9CiMjIENyZWF0ZSBnZ3Bsb3QgdGVtcGxhdGVzLgpwdGV4dCA8LSB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjkpKSwKICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKcHRleHQyIDwtIHB0ZXh0ICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCgojIyBRNy4gV2hhdCB0eXBlcyBvZiBwdWJsaWMgdHJhbnNwb3J0YXRpb24gZG8geW91IHJlZ3VsYXJseSB1c2U/CgpgYGB7ciBxNy1kYXRhfQojIHN1YnNldCBxdWVzdGlvbiBkYXRhLCByZW5hbWUgY29sdW1ucywgZ2F0aGVyIGludG8gc2luZ2xlIGNvbHVtbgpxN19kZiA8LSBkZiAlPiUKICBzZWxlY3QoQ2FzZUlELCBQUEdFTkRFUiwgUFBBR0UsIHBwYWdlY2F0LCBQUEVUSE0sIFBQSU5DSU1QLCBQUEVEVUMsIFBQRURVQ0FULAogICAgICAgICB3b3JrLCBQUFdPUkssIG1hcml0YWwsIFBQTUFSSVQsIFBQTVNBQ0FULCBwcHJlZzksIFBQU1RBVEVOLCBQUEhPVVNFLCBQUFJFTlQsIFBQTkVULAogICAgICAgICBRN18xOlE3XzcsIFE3X290aGVyVGV4dCwgd2VpZ2h0KSAlPiUKICByZW5hbWUoQnVzID0gUTdfMSwgQ2FycG9vbCA9IFE3XzIsIFN1YndheSA9IFE3XzMsIFRyYWluID0gUTdfNCwKICAgICAgICAgVGF4aSA9IFE3XzUsIEFpcnBsYW5lID0gUTdfNiwgT3RoZXIgPSBRN183KSAlPiUKICBnYXRoZXIoUTdfcSwgUTdfciwgQnVzOk90aGVyLCBuYS5ybSA9IFQpICU+JQogIG11dGF0ZShRN19xID0gYXMuZmFjdG9yKFE3X3EpKQoKIyBzZWxlY3Qgb25seSBZZXMgcmVzcG9uc2VzCnE3X2RmIDwtIHE3X2RmWyhxN19kZiRRN19yKT09J1llcycsIF0Kc3RyKHE3X2RmKQoKIyBzdXJ2ZXkgZGVzaWduCm9wdGlvbnMoZGlnaXRzID0gNCkKb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQpkZXM3IDwtIHN2eWRlc2lnbihpZHMgPSB+MSwgd2VpZ2h0cyA9IH53ZWlnaHQsIGRhdGEgPSBxN19kZltpcy5uYShxN19kZiR3ZWlnaHQpPT1GLCBdKQoKYGBgCgojIyMgR2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgaW5jb21lLCBlZHVjYXRpb24sIHdvcmsKCmBgYHtyIHE3LXBsb3QtMX0KIyB3ZWlnaHRlZCBkYXRhIGZyYW1lCnE3IDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflE3X3EgKyBRN19yICsgUFBHRU5ERVIgKyBwcGFnZWNhdCArIFBQRVRITSArIFBQSU5DSU1QICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQRURVQyArIFBQRURVQ0FUICsgd29yayArIFBQV09SSywgZGVzNywgcm91bmQgPSBUKSkKIyBwbG90IHRlbXBsYXRlcwp0aXRsZSA8LSBnZ3RpdGxlKCJXaGF0IHR5cGVzIG9mIHB1YmxpYyB0cmFuc3BvcnRhdGlvbiBkbyB5b3UgcmVndWxhcmx5IHVzZT8iKQoKIyMgbWFpbiBwbG90CnAgPC0gZ2dwbG90KHE3LCBhZXMoUTdfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcCArIGdlb21fYmFyKCkgKyB0aXRsZQoKYGBgCgpgYGB7ciBxNy1wbG90LTFifQojIyBwbG90MjogZXhjbHVkZSAnT3RoZXInIGNvbHVtbgpwMiA8LSBnZ3Bsb3QocTdbIShxNyRRN19xKT09J090aGVyJywgXSwgYWVzKFE3X3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CgojIGJ5IGdlbmRlcgpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RN19xKSArIGdndGl0bGUoIkJ5IGdlbmRlciIpCgojIGFnZSBib3hwbG90CnN2eWJveHBsb3QoUFBBR0V+UTdfcSwgZGVzNywgbWFpbiA9ICJBZ2UgYm94cGxvdCBwZXIgcmVzcG9uc2UiKQoKIyBieSBhZ2UgZ3JvdXAKcDIgKyBnZW9tX2JhcigpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gcHBhZ2VjYXQpICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBhZ2UgZ3JvdXAiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IFE3X3EpCgojIGJ5IGV0aG5pYyBncm91cApwICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKSArCiAgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFVEhNLCBmaWxsID0gUTdfcSkKcCArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFE3X3EpICsgZmFjZXRfd3JhcCh+UFBFVEhNKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkKCiMgYnkgaW5jb21lCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBpbmNvbWUiKSArIAogIHB0ZXh0MgpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUTdfcSkKCiMgYnkgZWR1Y2F0aW9uCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUFBFRFVDQVQpICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUTdfcSkKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEVEVUMsIGZpbGwgPSBRN19xKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUTdfcSkgKyBmYWNldF93cmFwKH5QUEVEVUNBVCkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUEVEVUNBVCkKCiMgYnkgd29yayBzdGF0dXMKcCArIGdlb21fYmFyKCkgKyBhZXMod29yaywgZmlsbCA9IHdvcmspICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBlbXBsb3ltZW50IHN0YXR1cyIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBXT1JLLCBmaWxsID0gUTdfcSkgKyBnZ3RpdGxlKCJCeSBlbXBsb3ltZW50IHN0YXR1cyIpCgpgYGAKCiMjIyBNYXJpdGFsIHN0YXR1cywgbWV0cm8gc3RhdHVzLCByZWdpb24sIHN0YXRlIG9mIHJlc2lkZW5jeSwgaG91c2UgdHlwZSwgaG91c2luZyBzdGF0dXMsIGludGVybmV0IGF2YWlsYWJpbGl0eQoKYGBge3IgcTctcGxvdC0yfQojIHVwZGF0ZSB3ZWlnaHRlZCBkYXRhIGZyYW1lCnE3LjIgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTdfcSArIFE3X3IgKyBtYXJpdGFsICsgUFBNQVJJVCArIFBQTVNBQ0FUICsgcHByZWc5ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTVEFURU4gKyBQUEhPVVNFICsgUFBSRU5UICsgUFBORVQsIGRlczcsIHJvdW5kID0gVCkpCgojIHJlc3RhdGUgcGxvdHMKcDMgPC0gZ2dwbG90KHE3LjIsIGFlcyhRN19xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwNCA8LSBnZ3Bsb3QocTcuMlshKHE3LjIkUTdfcSk9PSdPdGhlcicsIF0sIGFlcyhRN19xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dAoKYGBgCgpgYGB7ciBxNy1wbG90LTJifQojIGJ5IG1hcml0YWwgc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gbWFyaXRhbCkgKyBmYWNldF93cmFwKH5RN19xKSArIGdndGl0bGUoIkJ5IG1hcml0YWwgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMobWFyaXRhbCwgZmlsbCA9IFE3X3EpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUE1BUklULCBmaWxsID0gUFBNQVJJVCkgKyBmYWNldF93cmFwKH5RN19xKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFE3X3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQoKIyBieSBtZXRybyBzdGF0dXMKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTVNBQ0FULCBmaWxsID0gUFBNU0FDQVQpICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIikgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKSArIGZhY2V0X3dyYXAoflBQTVNBQ0FUKQoKIyBieSByZWdpb24KcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IHBwcmVnOSkgKyBnZ3RpdGxlKCJSZXNwb25zZXMgYnkgVVMgcmVnaW9uIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMocHByZWc5LCBmaWxsID0gUTdfcSkgKyBnZ3RpdGxlKCJVUyByZWdpb25zIGJ5IHJlc3BvbnNlIikKCiMgYnkgc3RhdGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTdfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTdfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCgojIGJ5IGhvdXNlIHR5cGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUEhPVVNFKSArIGdndGl0bGUoIkJ5IGhvdXNlIHR5cGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUFBIT1VTRSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBQUEhPVVNFKSArIGZhY2V0X3dyYXAoflE3X3EpICsgcHRleHQyCgojIGJ5IGhvdXNpbmcgc3RhdHVzCgojIGJ5IGludGVybmV0IGF2YWlsYWJpbGl0eQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBORVQpICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoUFBORVQsIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCgpgYGAKCgoKIyMgUTguIEZvciB3aGF0IHR5cGVzIG9mIGFjdGl2aXRpZXMgZG8geW91IHJlZ3VsYXJseSB1c2UgcHVibGljIHRyYW5zcG9ydGF0aW9uPwoKYGBge3IgcTgtZGF0YX0KIyBzdWJzZXQgcXVlc3Rpb24gZGF0YSwgcmVuYW1lIGNvbHVtbnMsIGdhdGhlciBpbnRvIHNpbmdsZSBjb2x1bW4KcThfZGYgPC0gZGYgJT4lCiAgc2VsZWN0KENhc2VJRCwgUFBHRU5ERVIsIFBQQUdFLCBwcGFnZWNhdCwgUFBFVEhNLCBQUElOQ0lNUCwgUFBFRFVDLCBQUEVEVUNBVCwKICAgICAgICAgd29yaywgUFBXT1JLLCBtYXJpdGFsLCBQUE1BUklULCBQUE1TQUNBVCwgcHByZWc5LCBQUFNUQVRFTiwgUFBIT1VTRSwgUFBSRU5ULCBQUE5FVCwKICAgICAgICAgUThfMTpROF82LCB3ZWlnaHQpICU+JQogIHJlbmFtZShXb3JrID0gUThfMSwgU2Nob29sID0gUThfMiwgU2hvcHBpbmcgPSBROF8zLCBWaXNpdGluZ19wZW9wbGUgPSBROF80LAogICAgICAgICBSZWNyZWF0aW9uID0gUThfNSwgT3RoZXIgPSBROF82KSAlPiUKICBnYXRoZXIoUThfcSwgUThfciwgV29yazpPdGhlciwgbmEucm0gPSBUKSAlPiUKICBtdXRhdGUoUThfcSA9IGFzLmZhY3RvcihROF9xKSkKCiMgc2VsZWN0IG9ubHkgWWVzIHJlc3BvbnNlcwpxOF9kZiA8LSBxOF9kZltxOF9kZiRROF9yID09ICdZZXMnLCBdCnN0cihxOF9kZikKCiMgc3VydmV5IGRlc2lnbgpvcHRpb25zKGRpZ2l0cyA9IDQpCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3UgPSAiYWRqdXN0IikKZGVzOCA8LSBzdnlkZXNpZ24oaWRzID0gfjEsIHdlaWdodHMgPSB+d2VpZ2h0LCBkYXRhID0gcThfZGZbaXMubmEocThfZGYkd2VpZ2h0KT09RiwgXSkKCmBgYAoKIyMjIEdlbmRlciwgYWdlLCBldGhuaWNpdHksIGluY29tZSwgZWR1Y2F0aW9uCgpgYGB7ciBxOC1wbG90LTF9CiMgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxOCA8LSBkYXRhLmZyYW1lKHN2eXRhYmxlKH5ROF9xICsgUThfciArIFBQR0VOREVSICsgcHBhZ2VjYXQgKyBQUEVUSE0gKyBQUElOQ0lNUCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBFRFVDICsgUFBFRFVDQVQgKyB3b3JrICsgUFBXT1JLLCBkZXM4LCByb3VuZCA9IFQpKQojIHBsb3QgdGVtcGxhdGVzCnRpdGxlIDwtIGdndGl0bGUoIkZvciB3aGF0IHR5cGVzIG9mIGFjdGl2aXRpZXMgZG8geW91IHJlZ3VsYXJseSB1c2UgcHVibGljIHRyYW5zcG9ydGF0aW9uPyIpCgojIyBtYWluIHBsb3QKcCA8LSBnZ3Bsb3QocTgsIGFlcyhROF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwICsgZ2VvbV9iYXIoKSArIHRpdGxlCgpgYGAKCmBgYHtyIHE4LXBsb3QtMWJ9CiMjIHBsb3QyOiBleGNsdWRlICdPdGhlcicgY29sdW1uCnAyIDwtIGdncGxvdChxOFshKHE4JFE4X3EpPT0nT3RoZXInLCBdLCBhZXMoUThfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKCiMgYnkgZ2VuZGVyCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhQUEdFTkRFUiwgZmlsbCA9IFBQR0VOREVSKSArIGZhY2V0X3dyYXAoflE4X3EpICsgZ2d0aXRsZSgiQnkgZ2VuZGVyIikKCiMgYWdlIGJveHBsb3QKc3Z5Ym94cGxvdChQUEFHRX5ROF9xLCBkZXM4LCBtYWluID0gIkFnZSBib3hwbG90IHBlciByZXNwb25zZSIpCgojIGJ5IGFnZSBncm91cApwMiArIGdlb21fYmFyKCkgKyBhZXMocHBhZ2VjYXQsIGZpbGwgPSBwcGFnZWNhdCkgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGFnZSBncm91cCIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gUThfcSkKCiMgYnkgZXRobmljIGdyb3VwCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQRVRITSwgZmlsbCA9IFBQRVRITSkgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpICsKICBwdGV4dDIKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBROF9xKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUThfcSkgKyBmYWNldF93cmFwKH5QUEVUSE0pICsgZ2d0aXRsZSgiQnkgZXRobmljIGdyb3VwIikKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBFVEhNKQoKIyBieSBpbmNvbWUKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBQUElOQ0lNUCkgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGluY29tZSIpICsgCiAgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBROF9xKQoKIyBieSBlZHVjYXRpb24KcCArIGdlb21fYmFyKCkgKyBhZXMoUFBFRFVDQVQsIGZpbGwgPSBQUEVEVUNBVCkgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFRFVDQVQsIGZpbGwgPSBROF9xKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQywgZmlsbCA9IFE4X3EpCnAgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBROF9xKSArIGZhY2V0X3dyYXAoflBQRURVQ0FUKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRURVQ0FUKQoKIyBieSB3b3JrIHN0YXR1cwpwICsgZ2VvbV9iYXIoKSArIGFlcyh3b3JrLCBmaWxsID0gd29yaykgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGVtcGxveW1lbnQgc3RhdHVzIikKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUFdPUkssIGZpbGwgPSBROF9xKSArIGdndGl0bGUoIkJ5IGVtcGxveW1lbnQgc3RhdHVzIikKYGBgCgojIyMgTWFyaXRhbCBzdGF0dXMsIG1ldHJvIHN0YXR1cywgcmVnaW9uLCBzdGF0ZSBvZiByZXNpZGVuY3ksIGhvdXNlIHR5cGUsIGhvdXNpbmcgc3RhdHVzLCBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKCmBgYHtyIHE4LXBsb3QtMn0KIyB3ZWlnaHRlZCBkYXRhIGZyYW1lCnE4LjIgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UThfcSArIFE4X3IgKyB3b3JrICsgbWFyaXRhbCArIFBQTUFSSVQgKyBQUE1TQUNBVCArIHBwcmVnOSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQU1RBVEVOICsgUFBIT1VTRSArIFBQUkVOVCArIFBQTkVULCBkZXM4LCByb3VuZCA9IFQpKQojIHJlc3RhdGUgcGxvdHMKcDMgPC0gZ2dwbG90KHE4LjIsIGFlcyhROF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwNCA8LSBnZ3Bsb3QocTguMlshKHE4LjIkUThfcSk9PSdPdGhlcicsIF0sIGFlcyhROF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dAoKYGBgCgpgYGB7ciBxOC1wbG90LTJifQojIGJ5IG1hcml0YWwgc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gbWFyaXRhbCkgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IG1hcml0YWwgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMobWFyaXRhbCwgZmlsbCA9IFE4X3EpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUE1BUklULCBmaWxsID0gUFBNQVJJVCkgKyBmYWNldF93cmFwKH5ROF9xKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFE4X3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQoKIyBieSBtZXRybyBzdGF0dXMKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTVNBQ0FULCBmaWxsID0gUFBNU0FDQVQpICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIikgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKSArIGZhY2V0X3dyYXAoflBQTVNBQ0FUKQoKIyBieSByZWdpb24KcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IHBwcmVnOSkgKyBnZ3RpdGxlKCJSZXNwb25zZXMgYnkgVVMgcmVnaW9uIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMocHByZWc5LCBmaWxsID0gUThfcSkgKyBnZ3RpdGxlKCJVUyByZWdpb25zIGJ5IHJlc3BvbnNlIikKCiMgYnkgc3RhdGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUThfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUThfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCgojIGJ5IGhvdXNlIHR5cGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUEhPVVNFKSArIGdndGl0bGUoIkJ5IGhvdXNlIHR5cGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUFBIT1VTRSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBQUEhPVVNFKSArIGZhY2V0X3dyYXAoflE4X3EpICsgcHRleHQyCgojIGJ5IGhvdXNpbmcgc3RhdHVzCgojIGJ5IGludGVybmV0IGF2YWlsYWJpbGl0eQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBORVQpICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoUFBORVQsIGZpbGwgPSBROF9xKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCmBgYAoKCgojIyBROS4gRG8gb3RoZXIgbWVtYmVycyBvZiB5b3VyIGhvdXNlaG9sZCByZWd1bGFybHkgdXNlIHB1YmxpYyB0cmFuc3BvcnRhdGlvbj8KCiMjIyBFdGhuaWNpdHksIGluY29tZSwgbWV0cm8gc3RhdHVzLCByZWdpb24sIHN0YXRlLCBob3VzZSB0eXBlLCBob3VzaW5nIHN0YXR1cwoKYGBge3IgcTktcGxvdC0xfQojIHdlaWdodGVkIGRhdGEgZnJhbWUKcTkgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTkgKyBQUEVUSE0gKyBQUElOQ0lNUCArIFBQTVNBQ0FUICsgcHByZWc5ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNUQVRFTiArIFBQSE9VU0UgKyBQUFJFTlQsIGRlcywgcm91bmQgPSBUKSkKIyBwbG90IHRlbXBsYXRlcwp0aXRsZSA8LSBnZ3RpdGxlKCJEbyBvdGhlciBtZW1iZXJzIG9mIHlvdXIgaG91c2Vob2xkIHJlZ3VsYXJseSB1c2UgcHVibGljIHRyYW5zcG9ydGF0aW9uPyIpCgojIyBtYWluIHBsb3QKcCA8LSBnZ3Bsb3QocTksIGFlcyhROSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcCArIGdlb21fYmFyKCkgKyB0aXRsZQpgYGAKCmBgYHtyIHE5LXBsb3QtMWJ9CiMjIHBsb3QyOiBleGNsdWRlICdEb25fdCBrbm93JyBjb2x1bW4KcDIgPC0gZ2dwbG90KHE5WyEocTkkUTkpPT0nRG9uX3Qga25vdycsIF0sIGFlcyhROSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKCiMgYnkgZXRobmljIGdyb3VwCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBFVEhNKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpICsgcHRleHQyCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRVRITSwgZmlsbCA9IFE5KQpwMiArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFE5KSArIGZhY2V0X3dyYXAoflBQRVRITSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBFVEhNKQoKIyBieSBpbmNvbWUKcDIgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUElOQ0lNUCkgKyBnZ3RpdGxlKCJCeSBpbmNvbWUiKSArIHB0ZXh0MgpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUElOQ0lNUCwgZmlsbCA9IFE5KQoKIyBieSBtZXRybyBzdGF0dXMKcDIgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUE1TQUNBVCkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIikgKyBhZXMoUFBNU0FDQVQsIGZpbGwgPSBROSkKCiMgYnkgcmVnaW9uCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKGZpbGwgPSBwcHJlZzkpICsgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5IFVTIHJlZ2lvbiIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKHBwcmVnOSwgZmlsbCA9IFE5KSArIGdndGl0bGUoIlVTIHJlZ2lvbnMgYnkgcmVzcG9uc2UiKQoKIyBieSBzdGF0ZQpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBTVEFURU4sIGZpbGwgPSBROSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTkpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQoKIyBieSBob3VzZSB0eXBlCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBIT1VTRSkgKyBnZ3RpdGxlKCJCeSBob3VzaW5nIikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IFBQSE9VU0UpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhQUEhPVVNFLCBmaWxsID0gUTkpICsgcHRleHQyCgojIGJ5IGhvdXNpbmcgc3RhdHVzCgpgYGAKCgoKIyMgUTEwLiBXaGF0IHR5cGVzIG9mIHB1YmxpYyB0cmFuc3BvcnRhdGlvbiBkbyBvdGhlciBtZW1iZXJzIG9mIHlvdXIgaG91c2Vob2xkIHJlZ3VsYXJseSB1c2U/CgpgYGB7ciBxMTAtZGF0YX0KIyBzdWJzZXQgcXVlc3Rpb24gZGF0YSwgcmVuYW1lIGNvbHVtbnMsIGdhdGhlciBpbnRvIHNpbmdsZSBjb2x1bW4KcTEwX2RmIDwtIGRmICU+JQogIHNlbGVjdChDYXNlSUQsIFBQR0VOREVSLCBQUEFHRSwgcHBhZ2VjYXQsIFBQRVRITSwgUFBJTkNJTVAsIFBQRURVQywgUFBFRFVDQVQsCiAgICAgICAgIHdvcmssIFBQV09SSywgbWFyaXRhbCwgUFBNQVJJVCwgUFBNU0FDQVQsIHBwcmVnOSwgUFBTVEFURU4sIFBQSE9VU0UsIFBQUkVOVCwgUFBORVQsCiAgICAgICBRMTBfMTpRMTBfOCwgd2VpZ2h0KSAlPiUKICByZW5hbWUoQnVzID0gUTEwXzEsIENhcnBvb2wgPSBRMTBfMiwgU3Vid2F5ID0gUTEwXzMsIFRyYWluID0gUTEwXzQsCiAgICAgICAgIFRheGkgPSBRMTBfNSwgQWlycGxhbmUgPSBRMTBfNiwgRG9uX3Rfa25vdyA9IFExMF83LCBPdGhlciA9IFExMF84KSAlPiUKICBnYXRoZXIoUTEwX3EsIFExMF9yLCBCdXM6T3RoZXIsIG5hLnJtID0gVCkgJT4lCiAgbXV0YXRlKFExMF9xID0gYXMuZmFjdG9yKFExMF9xKSkKCiMgc2VsZWN0IG9ubHkgWWVzIHJlc3BvbnNlcwpxMTBfZGYgPC0gcTEwX2RmW3ExMF9kZiRRMTBfciA9PSAnWWVzJywgXQpzdHIocTEwX2RmKQoKIyBzdXJ2ZXkgZGVzaWduCm9wdGlvbnMoZGlnaXRzID0gNCkKb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQpkZXMxMCA8LSBzdnlkZXNpZ24oaWRzID0gfjEsIHdlaWdodHMgPSB+d2VpZ2h0LCBkYXRhID0gcTEwX2RmW2lzLm5hKHExMF9kZiR3ZWlnaHQpPT1GLCBdKQpgYGAKCiMjIyBHZW5kZXIsIGFnZSwgZXRobmljaXR5LCBpbmNvbWUsIGVkdWNhdGlvbiwgd29yawoKYGBge3IgcTEwLXBsb3QtMX0KIyB3ZWlnaHRlZCBkYXRhIGZyYW1lCnExMCA8LSBkYXRhLmZyYW1lKHN2eXRhYmxlKH5RMTBfcSArIFExMF9yICsgUFBHRU5ERVIgKyBwcGFnZWNhdCArIFBQRVRITSArIFBQSU5DSU1QICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQRURVQyArIFBQRURVQ0FUICsgd29yayArIFBQV09SSywgZGVzMTAsIHJvdW5kID0gVCkpCiMgcGxvdCB0ZW1wbGF0ZXMKdGl0bGUgPC0gZ2d0aXRsZSgiV2hhdCB0eXBlcyBvZiBwdWJsaWMgdHJhbnNwb3J0YXRpb24gZG8gb3RoZXIgbWVtYmVycyBvZiB5b3VyIGhvdXNlaG9sZCByZWd1bGFybHkgdXNlPyIpCgojIyBtYWluIHBsb3QKcCA8LSBnZ3Bsb3QocTEwLCBhZXMoUTEwX3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CnAgKyBnZW9tX2JhcigpICsgdGl0bGUKYGBgCgpgYGB7ciBxMTAtcGxvdC0xYn0KIyMgcGxvdDI6IGV4Y2x1ZGUgJ0Rvbl90IGtub3cnIGNvbHVtbgpwMiA8LSBnZ3Bsb3QocTEwWyEocTEwJFExMF9xKT09J0Rvbl90X2tub3cnLCBdLCBhZXMoUTEwX3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CgojIGJ5IGdlbmRlcgpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBnZW5kZXIiKQoKIyBieSBhZ2UgZ3JvdXAKcDIgKyBnZW9tX2JhcigpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gcHBhZ2VjYXQpICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgYWdlIGdyb3VwIikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMocHBhZ2VjYXQsIGZpbGwgPSBRMTBfcSkKCiMgYnkgZXRobmljIGdyb3VwCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQRVRITSwgZmlsbCA9IFBQRVRITSkgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKSArCiAgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFVEhNLCBmaWxsID0gUTEwX3EpCnAgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBRMTBfcSkgKyBmYWNldF93cmFwKH5QUEVUSE0pICsgZ2d0aXRsZSgiQnkgZXRobmljIGdyb3VwIikKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBFVEhNKQoKIyBieSBpbmNvbWUKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBQUElOQ0lNUCkgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBpbmNvbWUiKSArIAogIHB0ZXh0MgpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUTEwX3EpCgojIGJ5IGVkdWNhdGlvbgpwICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVEVUNBVCwgZmlsbCA9IFBQRURVQ0FUKSArIGZhY2V0X3dyYXAoflExMF9xKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFRFVDQVQsIGZpbGwgPSBRMTBfcSkKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEVEVUMsIGZpbGwgPSBRMTBfcSkKcCArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFExMF9xKSArIGZhY2V0X3dyYXAoflBQRURVQ0FUKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRURVQ0FUKQoKIyBieSB3b3JrIHN0YXR1cwpwICsgZ2VvbV9iYXIoKSArIGFlcyh3b3JrLCBmaWxsID0gd29yaykgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBlbXBsb3ltZW50IHN0YXR1cyIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBXT1JLLCBmaWxsID0gUTEwX3EpICsgZ2d0aXRsZSgiQnkgZW1wbG95bWVudCBzdGF0dXMiKQpgYGAKCiMjIyBNYXJpdGFsIHN0YXR1cywgbWV0cm8gc3RhdHVzLCByZWdpb24sIHN0YXRlIG9mIHJlc2lkZW5jeSwgaG91c2UgdHlwZSwgaG91c2luZyBzdGF0dXMsIGludGVybmV0IGF2YWlsYWJpbGl0eQoKYGBge3IgcTEwLXBsb3QtMn0KIyB1cGRhdGUgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxMTAuMiA8LSBkYXRhLmZyYW1lKHN2eXRhYmxlKH5RMTBfcSArIFExMF9yICsgbWFyaXRhbCArIFBQTUFSSVQgKyBQUE1TQUNBVCArIHBwcmVnOSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQU1RBVEVOICsgUFBIT1VTRSArIFBQUkVOVCArIFBQTkVULCBkZXMxMCwgcm91bmQgPSBUKSkKIyByZXN0YXRlIHBsb3RzCnAzIDwtIGdncGxvdChxMTAuMiwgYWVzKFExMF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwNCA8LSBnZ3Bsb3QocTEwLjJbIShxMTAuMiRRMTBfcSk9PSdEb25fdF9rbm93JywgXSwgYWVzKFExMF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApgYGAKCmBgYHtyIHExMC1wbG90LTJifQojIGJ5IG1hcml0YWwgc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gbWFyaXRhbCkgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBtYXJpdGFsIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKG1hcml0YWwsIGZpbGwgPSBRMTBfcSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTUFSSVQsIGZpbGwgPSBQUE1BUklUKSArIGZhY2V0X3dyYXAoflExMF9xKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFExMF9xKSArIGdndGl0bGUoIkJ5IG1hcml0YWwgc3RhdHVzIikKCiMgYnkgbWV0cm8gc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUE1TQUNBVCwgZmlsbCA9IFBQTVNBQ0FUKSArIGZhY2V0X3dyYXAoflExMF9xKSArIGdndGl0bGUoIkJ5IG1ldHJvIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnc3RhY2snKSArIGFlcyhmaWxsID0gUFBNU0FDQVQpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBNU0FDQVQpICsgZmFjZXRfd3JhcCh+UFBNU0FDQVQpCgojIGJ5IHJlZ2lvbgpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gcHByZWc5KSArIGdndGl0bGUoIlJlc3BvbnNlcyBieSBVUyByZWdpb24iKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhwcHJlZzksIGZpbGwgPSBRMTBfcSkgKyBnZ3RpdGxlKCJVUyByZWdpb25zIGJ5IHJlc3BvbnNlIikKCiMgYnkgc3RhdGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTEwX3EpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFExMF9xKSArIGNvb3JkX2ZsaXAoKSArIGdndGl0bGUoIkJ5IHN0YXRlIikKCiMgYnkgaG91c2UgdHlwZQpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQSE9VU0UpICsgZ2d0aXRsZSgiQnkgaG91c2luZyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKGZpbGwgPSBQUEhPVVNFKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBIT1VTRSwgZmlsbCA9IFBQSE9VU0UpICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgcHRleHQyCgojIGJ5IGhvdXNpbmcgc3RhdHVzCgojIGJ5IGludGVybmV0IGF2YWlsYWJpbGl0eQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUFBORVQpICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoUFBORVQsIGZpbGwgPSBRMTBfcSkgKyBnZ3RpdGxlKCJJbnRlcm5ldCBzdGF0dXMiKQpgYGAKCgoK